#!/usr/bin/env python
# encoding: utf-8
'''
@author: Excelsiorly
@license: (C) Copyright 2022, All Rights Reserved.
@contact: excelsiorly@qq.com
@file: 232. 用栈实现队列.py
@time: 2022/1/12 13:43
@desc: https://leetcode-cn.com/problems/implement-queue-using-stacks/
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作（push、pop、peek、empty）：
实现 MyQueue 类：
    - void push(int x) 将元素 x 推到队列的末尾
    - int pop() 从队列的开头移除并返回元素
    - int peek() 返回队列开头的元素
    - boolean empty() 如果队列为空，返回 true ；否则，返回 false
说明：
    - 你 只能 使用标准的栈操作 —— 也就是只有push to top,peek/pop from top,size, 和is empty操作是合法的。
    - 你所使用的语言也许不支持栈。你可以使用 list 或者 deque（双端队列）来模拟一个栈，只要是标准的栈操作即可。

@解题思路：
    1. 双栈操作，左边倒出来，右边装进去，Push：O(1), pop: O(n), peek: O(n)
'''
class MyQueue(object):

    def __init__(self):
        self.stack1 = []
        self.stack2 = []


    def push(self, x):
        """
        :type x: int
        :rtype: None
        """
        self.stack1.append(x)


    def pop(self):
        """
        :rtype: int
        """
        if not self.stack1: return -1
        while self.stack1:
            node = self.stack1.pop()
            self.stack2.append(node)
        res = self.stack2.pop()
        while self.stack2:
            node = self.stack2.pop()
            self.stack1.append(node)
        return res



    def peek(self):
        """
        :rtype: int
        """
        if not self.stack1: return -1
        while self.stack1:
            node = self.stack1.pop()
            self.stack2.append(node)
        res = self.stack2[-1]
        while self.stack2:
            node = self.stack2.pop()
            self.stack1.append(node)
        return res


    def empty(self):
        """
        :rtype: bool
        """
        return len(self.stack1)==0



# Your MyQueue object will be instantiated and called as such:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()